/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.edu.fatec.ads.facade;

import br.edu.fatec.ads.classes.Sala;
import br.edu.fatec.ads.javacard.SmartCardConnector;

/**
 *
 * @author Ubirajara
 */
public class FacadeCartao {

    private SmartCardConnector connector = null;
    private static FacadeCartao singleton = null;

    private byte[] AppletBiblioteca = new byte[]{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x00 };
    private byte[] metodoCodigoCartao = new byte[]{ 0x10, 0x52, 0x00, 0x00 };
    private byte[] metodoSetEmprestimo = new byte[]{ 0x10, 0x51, 0x00, 0x00 };

    private byte[] AppletAcesso = new byte[] { (byte) 0xf1, 0x01, 0x03, 0x05, 0x07, 0x09, 0x0b, 0x0d, 0x0f, 0x00, 0x00 };
    private byte[] metodoGetCodigoCartaoAcesso = new byte[] { 0x20, 0x01, 0x00, 0x00 };
    private byte[] metodoAcessarSala = new byte[] { 0x20, 0x05, 0x00, 0x00 };


    private FacadeCartao() {
        connector = SmartCardConnector.getInstance();
    }

    public static FacadeCartao getInstance(){
        if(singleton == null){
            singleton = new FacadeCartao();
        }

        return singleton;
    }

    /* METODOS - APPLET BIBLIOTECA */
    public int recuperarCodigoCartao()
        throws Exception{
        Integer codigoCartao = null;

        try{
            connector.conectarLeitora();
            connector.acessarApplet(AppletBiblioteca);
            byte[] resultado = connector.acessarMetodo(metodoCodigoCartao, 2);

            System.out.println("ConvertByteArrayToInt: " + SmartCardConnector.getInstance().formatBuffer(resultado, resultado.length));

           codigoCartao = connector.convertByteArrayToInt(resultado);
        }catch(Exception cause){
            if(cause.getMessage() == null){
                throw new Exception("Favor conectar o cartão a leitora!");
            }else{
                throw cause;
            }
        }

        return codigoCartao;
    }

    public void setEmprestimo(int codigoEmprestimo)
        throws Exception{

        byte[] arrayEmprestimo = this.convertShortToByteArray((short) codigoEmprestimo);

        try{
            connector.conectarLeitora();
            connector.acessarApplet(AppletBiblioteca);

            int resultado = connector.acessarMetodo(metodoSetEmprestimo, arrayEmprestimo);

            System.out.println("Resultado do cadastro do Emprestimo: " + resultado);

            if(resultado != 0x9000){
                throw new Exception("Problemas na gravação do empréstimo no cartão!");
            }

        }catch(Exception cause){
            throw cause;
        }

    }

    /* METODOS - APPLET ACESSO */
    public Integer recuperarCodigoCartaoAcesso()
        throws Exception{
        Integer codigoCartao = null;

        try{
            connector.conectarLeitora();
            connector.acessarApplet(AppletAcesso);
            byte[] resultado = connector.acessarMetodo(metodoGetCodigoCartaoAcesso, 2);

           codigoCartao = this.convertByteArrayToShort(resultado).intValue();
        }catch(Exception cause){
            throw cause;
        }

        return codigoCartao;
    }

    public boolean acessarSala(Sala sala)
        throws Exception{
        int resultado = 0;

        try{
            connector.conectarLeitora();
            connector.acessarApplet(AppletAcesso);

            resultado = connector.acessarMetodo(metodoAcessarSala, this.convertShortToByteArray((short) sala.getCodigo()));
        }catch(Exception cause){
            cause.printStackTrace();
            
            resultado = 0x6984;
        }

        return (resultado == 0x9000);
    }

    private byte[] convertShortToByteArray(short valor){
        byte[] array = new byte[] { (byte)(valor & 0xFF), (byte)((valor >> 8) & 0xFF)};

        return array;
    }

    private Short convertByteArrayToShort(byte[] valor){
	return (short) ((valor[0] & 0xff) | (((valor[1] << 8)  & 0xff)));
    }

}